package cn.edu.flying_birds;

import cn.edu.flying_birds.utils.Tools;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @PackageName: cn.edu.flying_birds
 * @ClassName: BirdPanel
 * @Description: 游戏画板类
 * @author: RZS
 * @date: 2021/6/6  22:53
 */
public class BirdPanel extends JPanel {

    // 声明一个用于存放背景图片的变量
    BufferedImage bg;
    // 声明地面类型变量
    Ground ground;
    // 声明柱子类型变量
    Column column;
    // 声明第二根柱子类型变量
    Column column2;
    // 创建小鸟变量
    Bird bird;
    // 游戏准备状态
    boolean start;
    // 游戏结束状态
    boolean gameOver;
    // 积分
    int score;
    Timer timer;

    public BirdPanel() throws IOException {
        // 调用初始化方法，初始化游戏状态
        init();

        // 初始化鼠标监听器
        MouseAdapter mouseAdapter = new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e) {
                System.err.println("start: "+start+", gameOver: "+gameOver);
                // 判断游戏状态
                if(start){
                    if(gameOver){
                        // 调用初始化方法，初始化游戏状态
                        try {
                            // 关闭定时器
                            timer.cancel();
                            init();
                            // 刷新游戏
                            repaint();
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                    // 当点击鼠标时，先判断小鸟有没有到达窗口最上方，然后小鸟向上运动
                    if(bird.y <= 0){
                        // 小鸟飞到了窗口的顶部
                    }else{
                        bird.moveUp();
                    }
                } else{
                    // 将游戏状态改为运行状态
                    start = true;
                    // 启动游戏
                    start();
                }

            }
        };
        // 添加鼠标监听对象
        this.addMouseListener(mouseAdapter);

    }

    /**
     * 游戏初始化方法
     * @throws IOException
     */
    private void init() throws IOException {
        // 设置背景颜色
        setBackground(Color.BLACK);
        // 设置背景图片
        bg = Tools.getImg("../../img/bg.png");
        // 初始化地面类型变量
        ground = new Ground();
        // 初始化柱子变量
        column = new Column(1);
        // 初始化第二根柱子变量
        column2 = new Column(2);
        // 初始化小鸟对象
        bird = new Bird();
        // 初始化游戏状态  未运行 false  运行 true
        start = false;
        // 初始化游戏结束状态
        gameOver = false;
        // 初始化积分
        score = 0;

    }

    /**
     * 游戏启动方法
     */
    public void start(){
        /**
         * 利用定时器来调用地面移动的方法
         * Timer：定时器对象
         */
        timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 判断游戏结束状态
                if(!gameOver && start){
                    // 让地面移动起来
                    ground.move();
                    // 让柱子移动起来
                    column.move();
                    // 让第二根柱子移动起来
                    column2.move();
                    // 让小鸟飞起来
                    bird.flying();
                    // 检测小鸟是否与柱子1相撞
                    boolean bool1 = bird.strike(column);
                    // 检测小鸟是否与柱子2相撞
                    boolean bool2 = bird.strike(column2);

                    // 判断小鸟是否落到了地面、撞到柱子
                    if(!bird.strike() && !bool1 && !bool2){
                        // 调用方法使小鸟下落
                        bird.moveDown();
                    }else{
                        gameOver = true;
                    }
                    // 计分
                    if((bird.x == column.x+column.width) || (bird.x == column2.x+column2.width)){
                        score ++;
                    }
                }

                // 刷新游戏界面
                repaint();
            }
        };
        timer.schedule(task, 0, 30);

    }

    // 重写paint方法  g 画笔
    public void paint(Graphics g){
        // 绘制背景图片，参数（要绘制的图片， X坐标， Y坐标， null）
        g.drawImage(bg, 0, 0, null);
        // 绘制柱子
        g.drawImage(column.img, column.x, column.y, column.width, column.height, null);
        // 绘制第二根柱子
        g.drawImage(column.img, column2.x, column2.y, column2.width, column2.height, null);
        // 绘制小鸟对象
        g.drawImage(bird.img, bird.x, bird.y, bird.width, bird.height, null);

        // 绘制地面图片
        g.drawImage(ground.img, ground.x, ground.y, null);

        // 绘制游戏准备状态图片（运行与暂停状态）
        if(!start){
            try {
                g.drawImage(Tools.getImg("../../img/start.png"), 0, 0, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 绘制游戏结束图片
        if(gameOver){
            try {
                g.drawImage(Tools.getImg("../../img/gameover.png"), 0, 0, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 绘制积分
        g.setColor(Color.white);
        g.setFont(new Font("黑体", Font.BOLD, 20));
        g.drawString("分数："+score, 15, 30);
    }
}
